/*******************************************************************************
* Copyright (c) 2008 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.smooks.graphical.editors.editparts.freemarker;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LayoutManager;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.ComponentEditPolicy;
import org.eclipse.gef.editpolicies.FlowLayoutEditPolicy;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.requests.DirectEditRequest;
import org.eclipse.gef.requests.GroupRequest;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel;
import org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart;
import org.jboss.tools.smooks.gef.tree.figures.TreeFigureExpansionEvent;
import org.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure;
import org.jboss.tools.smooks.gef.tree.model.TreeNodeModel;
import org.jboss.tools.smooks.graphical.editors.commands.AddSmooksGraphicalModelCommand;
import org.jboss.tools.smooks.graphical.editors.commands.ChangeCSVNodeNameCommand;
import org.jboss.tools.smooks.graphical.editors.commands.DeleteSmooksGraphicalModelCommand;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.CSVNodeModel;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerCSVNodeGraphicalModel;
/**
* @author Dart
*
*/
public class FreemarkerCSVNodeEditPart extends TreeNodeEditPart {
private Font csvRecordFont;
public FreemarkerCSVNodeEditPart() {
super();
childrenLoaded = true;
}
/**
* @return the xslLabelFont
*/
public Font getCSVRecordLabelFont() {
if (csvRecordFont == null) {
IFigure figure = getFigure();
FontData fd = new FontData();
fd.setStyle(SWT.BOLD);
if (figure != null) {
FontData[] fds = figure.getFont().getFontData();
if (fds != null && fds.length > 0) {
fd.setHeight(fds[0].getHeight());
fd.setName(fds[0].getName());
fd.setLocale(fds[0].getLocale());
}
}
csvRecordFont = new Font(null, fd);
}
return csvRecordFont;
}
@Override
public void deactivate() {
super.deactivate();
if (csvRecordFont != null) {
csvRecordFont.dispose();
}
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#createFigure()
*/
@Override
protected IFigure createFigure() {
CSVNodeModel node = (CSVNodeModel) ((AbstractSmooksGraphicalModel) getModel()).getData();
if (node.isRecord()) {
IFigure figure = new TreeNodeFigure((TreeNodeModel) getModel()) {
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#initFigure
* ()
*/
@Override
protected void initFigure() {
super.initFigure();
SPACE_INT = 0;
CLICKNODE_HEIGHT = 0;
CLICKNODE_WIDTH = 0;
expand = true;
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#
* getPreferredSize(int, int)
*/
@Override
public Dimension getPreferredSize(int hint, int hint2) {
expand = true;
return super.getPreferredSize(hint, hint2);
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#
* createLabelContainerLayout()
*/
@Override
protected LayoutManager createLabelContainerLayout() {
ToolbarLayout tl = new ToolbarLayout();
tl.setVertical(false);
tl.setMinorAlignment(ToolbarLayout.ALIGN_BOTTOMRIGHT);
return tl;
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#
* drawClickFigure(org.eclipse.draw2d.IFigure,
* org.eclipse.draw2d.Graphics)
*/
@Override
protected void drawClickFigure(IFigure clickFigure, Graphics graphics) {
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#
* needClickFigure()
*/
@Override
protected boolean needClickFigure() {
Object data = this.getModel().getData();
if (data instanceof CSVNodeModel) {
if (((CSVNodeModel) data).isRecord()) {
return true;
}
}
return false;
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#
* needSpaceFigure()
*/
@Override
protected boolean needSpaceFigure() {
Object data = this.getModel().getData();
if (data instanceof CSVNodeModel) {
if (((CSVNodeModel) data).isRecord()) {
return true;
}
}
return false;
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#
* createContentFigureLayout()
*/
@Override
protected ToolbarLayout createContentFigureLayout() {
ToolbarLayout layout = super.createContentFigureLayout();
layout.setVertical(true);
return layout;
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#
* createTreeNodeFigureLayout()
*/
@Override
protected ToolbarLayout createTreeNodeFigureLayout() {
ToolbarLayout layout = super.createTreeNodeFigureLayout();
// layout.setSpacing(5);
layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
return layout;
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#
* collapsedNode()
*/
@Override
public void collapsedNode() {
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure#expandNode
* ()
*/
@Override
public void expandNode() {
}
};
return figure;
}
return super.createFigure();
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#expandNode()
*/
@Override
public void expandNode() {
super.expandNode();
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#treeCollapsed
* (org.jboss.tools.smooks.gef.tree.figures.TreeFigureExpansionEvent)
*/
@Override
public void treeCollapsed(TreeFigureExpansionEvent event) {
System.out.println();
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#treeExpanded
* (org.jboss.tools.smooks.gef.tree.figures.TreeFigureExpansionEvent)
*/
@Override
public void treeExpanded(TreeFigureExpansionEvent event) {
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#createEditPolicies
* ()
*/
@Override
protected void createEditPolicies() {
super.createEditPolicies();
this.installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy() {
@Override
protected Command getDeleteCommand(GroupRequest request) {
List<?> editParts = request.getEditParts();
for (Iterator<?> iterator = editParts.iterator(); iterator.hasNext();) {
EditPart editPart = (EditPart) iterator.next();
AbstractSmooksGraphicalModel graphModel = (AbstractSmooksGraphicalModel) editPart.getModel();
Object data = graphModel.getData();
data = AdapterFactoryEditingDomain.unwrap(data);
if (data instanceof CSVNodeModel && !((CSVNodeModel) data).isRecord()) {
DeleteSmooksGraphicalModelCommand deleteCommand = new DeleteSmooksGraphicalModelCommand(
graphModel);
return deleteCommand;
}
}
return null;
}
});
this.installEditPolicy(EditPolicy.LAYOUT_ROLE, new FlowLayoutEditPolicy() {
@Override
protected Command getCreateCommand(CreateRequest request) {
Object model = request.getNewObject();
Object graphModel = getHost().getModel();
if (graphModel instanceof FreemarkerCSVNodeGraphicalModel) {
ILabelProvider provider = ((FreemarkerCSVNodeGraphicalModel) graphModel).getLabelProvider();
ITreeContentProvider provider1 = ((FreemarkerCSVNodeGraphicalModel) graphModel)
.getContentProvider();
IEditingDomainProvider provider2 = ((FreemarkerCSVNodeGraphicalModel) graphModel)
.getDomainProvider();
Object parentData = ((FreemarkerCSVNodeGraphicalModel) graphModel).getData();
if (parentData instanceof CSVNodeModel) {
if (((CSVNodeModel) parentData).isRecord()) {
if (model instanceof CSVNodeModel && !((CSVNodeModel) model).isRecord()) {
FreemarkerCSVNodeGraphicalModel childGraphModel = new FreemarkerCSVNodeGraphicalModel(
model, provider1, provider, provider2);
AddSmooksGraphicalModelCommand command = new AddSmooksGraphicalModelCommand(
(AbstractSmooksGraphicalModel) graphModel, childGraphModel);
return command;
}
}
}
}
return null;
}
@Override
protected Command createMoveChildCommand(EditPart child, EditPart after) {
// TODO Auto-generated method stub
return null;
}
@Override
protected Command createAddCommand(EditPart child, EditPart after) {
return null;
}
@Override
protected EditPolicy createChildEditPolicy(EditPart child) {
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editpolicies.FlowLayoutEditPolicy#isHorizontal()
*/
@Override
protected boolean isHorizontal() {
return false;
}
});
}
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#
* createDirectEditCommand(org.eclipse.gef.requests.DirectEditRequest)
*/
@Override
protected Command createDirectEditCommand(DirectEditRequest request) {
Object value = request.getCellEditor().getValue();
if (value != null && value instanceof String) {
ChangeCSVNodeNameCommand command = new ChangeCSVNodeNameCommand(
(FreemarkerCSVNodeGraphicalModel) getModel(), value);
return command;
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#canDirectEdit
* ()
*/
@Override
protected boolean canDirectEdit() {
Object data = ((AbstractSmooksGraphicalModel) getModel()).getData();
if (data instanceof CSVNodeModel && !((CSVNodeModel) data).isRecord()) {
return true;
}
return false;
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.editparts.TreeNodeEditPart#refreshVisuals
* ()
*/
@Override
protected void refreshVisuals() {
AbstractSmooksGraphicalModel model = (AbstractSmooksGraphicalModel) getModel();
TreeNodeFigure figure = (TreeNodeFigure) getFigure();
Object data = model.getData();
if (data instanceof CSVNodeModel) {
if (((CSVNodeModel) data).isRecord()) {
figure.setNodeLabelForegroundColor(ColorConstants.blue);
figure.getLabel().setFont(getCSVRecordLabelFont());
}
}
super.refreshVisuals();
}
}